package com.qudian.pay.redis.lock;

import java.util.concurrent.locks.Lock;
import com.qudian.pay.redis.exception.LockException;
import com.qudian.pay.redis.support.ICache;

/**
 * @Description: 锁持有工具
 * @ClassName: LockHolder
 * @author gaoxiang
 * @date 2016年6月8日 下午3:08:48
 */
public final class LockHolder {
	
	private final static String SPLIT_PREFIX = "#";
	
	/**
	 * @Description: 创建锁
	 * @param bizCode 业务CODE
	 * @param lockKey 锁字段
	 * @param timeoutMsecs 获取锁超时时间<毫秒>
	 * @param expireMsecs 锁超时时间<毫秒>
	 * @return Lock 返回类型
	 * @author gaoxiang
	 * @date 2016年6月8日 下午3:14:58
	 */
	public static Lock createLock(ICache<String> cache,String bizCode, String lockKey, long timeoutMsecs, long expireMsecs) {
		if (timeoutMsecs <= 0) throw new LockException(-1, "锁创建失败.原因：[timeoutMsecs] <= 0");
		if (expireMsecs <= 0) throw new LockException(-1, "锁创建失败.原因：[expireMsecs] <= 0");
		return new DistributedLock(cache,bizCode.concat(SPLIT_PREFIX).concat(lockKey), timeoutMsecs, expireMsecs);
	}
	
	/**
	 * @Description: 锁超时时间默认为30分钟
	 * @param bizCode 业务CODE
	 * @param lockKey 锁字段
	 * @param timeoutMsecs
	 * @return Lock 返回类型
	 * @author gaoxiang
	 * @date 2016年6月8日 下午3:44:54
	 */
	public static Lock createLock(ICache<String> cache,String bizCode, String lockKey, long timeoutMsecs) {
		return new DistributedLock(cache, bizCode.concat(SPLIT_PREFIX).concat(lockKey), timeoutMsecs);
	}
	
	/**
	 * @Description: 锁超时时间默认为30分钟,获取锁超时时间默认为1分钟
	 * @param bizCode 业务CODE
	 * @param lockKey 锁字段
	 * @return Lock 返回类型
	 * @author gaoxiang
	 * @date 2016年6月8日 下午3:44:00
	 */
	public static Lock createLock(ICache<String> cache,String bizCode, String lockKey) {
		return new DistributedLock(cache, bizCode.concat(SPLIT_PREFIX).concat(lockKey));
	}
	
}
